#
import tensorflow as tf
from keras.preprocessing import image
from keras.applications.inception_v3 import preprocess_input
import numpy as np
import os

"""
Keras.Layes的常见层：
1.描述卷积层：tf.keras.layers.Conv2D(filters,kernel_size,strides,padding,activation)
    1）Conv1D——一维卷积层（即时域卷积），用以在一位输入信号上进行邻域滤波。
    2）Conv2D——二维卷积层，即对图像的空域卷积。
    该层对二维输入进行滑动窗卷积。当使用该层作为第一层的时候，需要提供input_shape；如128 * 128的彩色RGB图像= (128,128,3)
    3)SeparableConv2D()——该层是在深度方向上可分离的卷积。可分离卷积可以看做将一个卷积核分解为两个小的卷积核，或者看做Inception模块的一种极端情况。
    可分离卷积首先按照深度方向进行卷积（对每个输入通道分别卷积），然后逐点进行卷积，将上一步的卷积结果混合到输出通道。
2.激活层：Activation（）——对一个层的输出施加激活函数

3.Drouput层：对输入数据施加Drouput，用于防止过拟合。Drouput将在训练的过程中每次更新参数时按一定的概率随机断开输入神经元。
    Drouput（控制需要断开的神经元的比例rate,整数张量noise_shape = None,随机数seed = None）

4.Flatten层：——用于将输入“压平”，即把多维的输入一维化，常用在从卷积层到全连接层的过度。
    Flatten不影响batch的大小。

5.Permute层——将输入的维度按照给定模式进行重排（即交换两行）。当需要将RNN +CNN进行拼接的时候会用到该层。

6.池化层Pooling（池化窗口大小pool_size,下采样因子strides,padding）
    下采样因子strides：若设置为2，
    1)MaxPooling1D——对时域1D信号进行最大池化；
    2)MaxPooling2D——对空域信号施加最大值池化；

7.keras有两种model:
 (1)Sequential模型——是多个网络层的线性堆叠；
（2）泛型模型

8.在keras中，使用model.summary()输出模型各层的参数情况
"""
# 1.简单的从图像中提取特征，无法提取具体细节，进而影响模型性能
def extract_image_features():
    model = tf.keras.Sequential()
    # 1) 在网络中添加第一层卷积和池化

    model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size = (3,3),input_shape = (90,90,3),padding = 'VALID',activation = "relu"))
    model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size = (3,3),activation = "relu"))
    model.add(tf.keras.layers.MaxPool2D(pool_size = 32,stride = 2))

    # 2) 在网络中添加第二层卷积和池化
    model.add(tf.keras.layers.Conv2D(filters = 32,kernel_size = (3,3),padding = "VALID",actiivation = "relu"))
    model.add(tf.keras.layers.AveragePooling2D(pool_size = (3,3),strides = 1))

    # (3) flattening the output using flatten layer,since the input to neuralnet has to be flat
    # 用于将输入“压平”，即把多维输入一维化
    model.add(tf.keras.layers.Flatten())
    model.summary()    # (4) model.summary——输出模型各层的参数情况
    return model

image_path = "D:\PyCharm2018\PyCharmProject\Vis2LanDemo\photo"
for file in os.listdir(image_path):
    path = image_path + "//" + file
    img = image.load_img(path, target_size=(90, 90))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    feature = extract_image_features.predict(img_data)
    feature = np.reshape(feature, feature.shape[1])

print(path)
# print(feature)
print(image_path)




